﻿//******************************************************************************
//    Copyright (c) 2013 INFOGRAM Inc. All Right Reserved.
//
//    SystemName    : 危機管理教育・訓練支援システム
//    CategoryName  : 
//    FileName      : EntityRepository.cs
//    Description   : Base class for all business class
//                                                              
//    Created By    : 2012.12.20  Vo Viet Khanh
//    Updated By    : 
//
//******************************************************************************

using System;
using System.Data.Entity;
using TanWeb.Models.DataAccess.Infrastructure;
using log4net;

namespace TanWeb.Controllers.Business.Infrastructure
{
    /// <summary>
    /// Baseビジネスクラス
    /// </summary>
    public class BaseBusiness : IDisposable
    {
        //===============================================================
        //  プライベート変数
        //===============================================================
        #region /***    Private Variable Declared    ***/
        /// <summary>
        /// Log4net 変数
        /// </summary>
        protected static readonly ILog logger = LogManager.GetLogger(typeof(BaseDataAccess));
        #endregion

        //===============================================================
        //  コンストラクタ等宣言
        //===============================================================
        #region /***    Constructor Destructor Declared    ***/
        /// <summary>
        /// コンストラクタ
        /// </summary>
        public BaseBusiness()
            : this(null)
        {
        }

        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="dbContext">データベースコンテキスト</param>
        public BaseBusiness(DbContext dbContext)
        {
            // 既定のコントラクタを使用する場合、コンテキストを初期化する
            this.DbContext = dbContext ?? new TanWebDbContext();
        }

        /// <summary>
        /// デストラクター
        /// </summary>
        ~BaseBusiness()
        {
            this.Dispose(false);
        }
        #endregion

        //===============================================================
        //  プロパティ宣言
        //===============================================================
        #region /***    Propertie Declared    ***/
        /// <summary>
        /// Dispose が呼び出されたか確認する
        /// </summary>
        public bool Disposed { get; set; }

        /// <summary>
        /// データベースコンテキスト
        /// </summary>
        protected DbContext DbContext { get; private set; }
        #endregion

        //===============================================================
        //  パブリックメソッド宣言
        //===============================================================
        #region /***    Public Method Declared    ***/
        /// <summary>
        /// Idisposableを実装する
        /// </summary>
        public void Dispose()
        {
            Dispose(true);
            // このオブジェクトのファイナライズコードを二回目の実施しないように
            // ファイナライズキューに自身を脱ぐ
            GC.SuppressFinalize(this);
        }
        #endregion

        //===============================================================
        //  パブリックメソッド宣言
        //===============================================================
        #region /***    Protected Method Declared    ***/
        /// <summary>
        /// 管理と管理対象外のメンバーをDisposeする
        /// </summary>
        /// <param name="disposing">
        /// Diposeはtrueの場合、
        ///     管理と管理対象外のリソースをDisposeすることができる
        /// Diposeはfalseの場合、
        ///     管理対象外のリソースのみをDisposeすることができる
        /// </param>
        protected virtual void Dispose(bool disposing)
        {
            // Disposeが呼び出されたか確認する
            if (!this.Disposed)
            {
                // Diposeはtrueの場合、全ての管理と管理対象外のリソースを
                // Disposeする
                if (disposing)
                {
                    // 管理リソースをDisposeする
                    if (this.DbContext != null)
                    {
                        this.DbContext.Dispose();
                    }
                }
                // 管理対象外リソースをDisposeする
            }
            // 全てDisposeする
            this.Disposed = true;
        }
        #endregion
    }
}
